/*
 * @Author: hemenghao
 * @Date: 2023-03-01 17:20:09
 * @LastEditors: hemenghao
 * @LastEditTime: 2023-03-2 15:37:33
 * @Description: websocket连接工具
 */

import { ElMessage, ElLoading, ElMessageBox, ElNotification } from 'element-plus'
import 'element-plus/es/components/message/style/css'
import config from './config'
import useUserStore from '@/store/modules/user'

let socket = null // 连接对象
let linkFailCount = 0 // 连接次数，目前连接三次
let relinkLoading = null // 重连全屏loading

/**
 * @description: 初始化websocket
 * @param {*} linkUrl url的地址
 * @return {WebSocket} WebSocket对象
 * @Author: hemenghao
 */
function initWebSocket () {
  const userStore = useUserStore()
  // 正在连接或连接成功
  if (socket && socket.readyState < 2) {
    return socket
  }
  const url = config.url + userStore.userId
  socket = new WebSocket(url) // 创建对象
  // socket.onerror = webSocketOnError // 连接错误处理
  // socket.onclose = closeWebsocket // 连接关闭处理
  socket.onopen = openWebsocket // 连接打开处理
  socket.onmessage = webscoketDealData
  return socket
}

/**
 * @description: 处理websocket返回的数据
 * @param {*} res 后端返回的数据
 * @return {Object<JSON>}
 * @Author: hemenghao
 */
function webscoketDealData (res, type) {
  const userStore = useUserStore()
  console.log('建立链接')
  if (!res) return 'null'
  if (res.data == 'SUCCESS') {
    ElNotification({
      type: 'success',
      title: '消息提示',
      message: h('p', { style: 'color: red' }, '已成功连接服务器！'),
      duration: 3000,
      position: 'top-right'
    })
    return
  }
  const result = JSON.parse(res.data)
  if (result.alarmWay && result.alarmWay == 2) {
    ElNotification({
      type: 'warning',
      title: `消息类型： ${result.messageTypeDict}`,
      dangerouslyUseHTMLString: true,
      message: `<div style="color:red">消息内容：${result.message}</div>
        <div style=" margin-top:10px ;">告警时间：${result.today}</div>`,
      duration: 5000,
      position: 'bottom-right'
    })
    // 触发socket 改变缓存值 便于监听
    userStore.changeSocket()
    // 触发消息数量接口
    userStore.setMsgTotal()

    return result
  } else {
    userStore.changeSocket()
  }
}

/**
 * @description: 连接错误回调函数处理
 * @param {*} e 错误对象
 * @Author: hemenghao
 */
function webSocketOnError (e) {
  closeWebsocket()
  linkFailCount++ // 连接失败的次数
  if (relinkLoading) {
    relinkLoading.close() // 关闭重连加载动画
  }
  //连接三次
  if (linkFailCount < 3) {
    // 开启重连加载动画
    relinkLoading = ElLoading.service({
      lock: true,
      text: `第${linkFailCount}次连接失败，正在尝试第${linkFailCount + 1}次重新连接，请稍等...`
    })
  } else {
    ElMessageBox.confirm('连接失败，是否尝试刷新？', '警告', {
      confirmButtonText: '刷新',
      cancelButtonText: '取消',
      type: 'warning',
      'close-on-click-modal': false
    }).then(e => {
      if (e == 'confirm') {
        location.reload()
      }
    })
  }
}

/**
 * @description: 打开websocket回调函数处理
 * @return {*}
 * @Author: hemenghao
 */
function openWebsocket () {
  // console.log('WebSocket连接打开...')
  linkFailCount = 0 // 打开连接，连接次数改为0
  // 加载动画如果开启，则关闭
  if (relinkLoading) {
    relinkLoading.close()
  }
}

/**
 * @description: 关闭websocket回调函数处理
 * @return {*}
 * @Author: hemenghao
 */
function closeWebsocket () {
  // 连接关闭时，立刻开启重连机制
  if (linkFailCount < 3 && socket && socket.readyState >= 2) {
    // 开启重连加载动画
    relinkLoading = ElLoading.service({
      lock: true,
      text: `连接关闭了，正在重连，请稍等...`
    })
    initWebSocket()
  }
}

export default { initWebSocket, webscoketDealData }
